"""
文件夹处理辅助函数
用于处理不同邮件提供商的命名空间文件夹
"""
import json
import os
from typing import Optional, Tuple
from api.utils.logger import get_logger

logger = get_logger("folder_helper")

# 全局配置缓存
_provider_config = None

def load_provider_config():
    """加载邮件提供商配置"""
    global _provider_config
    if _provider_config is None:
        config_path = os.path.join(os.path.dirname(__file__), '../config/email_provider_config.json')
        try:
            with open(config_path, 'r', encoding='utf-8') as f:
                _provider_config = json.load(f)
        except Exception as e:
            logger.error(f"加载邮件提供商配置失败: {e}")
            _provider_config = {"providers": {}}
    return _provider_config

def get_provider_by_email(email: str) -> Optional[dict]:
    """
    根据邮箱地址获取提供商配置
    使用严格匹配，不使用startswith/endswith
    
    Args:
        email: 邮箱地址
        
    Returns:
        提供商配置字典，如果未找到返回None
    """
    if not email or '@' not in email:
        return None
    
    domain = email.split('@')[-1].lower()
    config = load_provider_config()
    
    for provider_name, provider_info in config.get('providers', {}).items():
        domains = provider_info.get('domains', [])
        # 严格匹配域名
        if domain in [d.lower() for d in domains]:
            return provider_info
    
    return None

def strip_namespace_folder(folder_path: str, email: str) -> str:
    """
    剥离命名空间文件夹前缀
    如果只有一层（完全匹配namespace_folder），则不剥离
    如果有多层（namespace_folder/子文件夹），则剥离namespace_folder层
    
    Args:
        folder_path: 文件夹路径（如 "其他文件夹/我的文件夹"）
        email: 邮箱地址
        
    Returns:
        处理后的文件夹路径
    """
    provider = get_provider_by_email(email)
    if not provider:
        return folder_path
    
    namespace_folders = provider.get('namespace_folders', [])
    if not namespace_folders:
        return folder_path
    
    # 检查是否匹配任何命名空间文件夹
    for ns_folder in namespace_folders:
        # 严格匹配：完全等于命名空间文件夹（只有一层）
        if folder_path == ns_folder:
            # 只有一层，不剥离
            return folder_path
        
        # 检查是否以 "namespace_folder/" 开头（有子文件夹）
        prefix = ns_folder + '/'
        if folder_path.startswith(prefix):
            # 有多层，剥离命名空间文件夹层
            stripped = folder_path[len(prefix):]
            return stripped
    
    return folder_path

def get_server_folder_path(folder_path: str, email: str, folder_mapping: dict) -> str:
    """
    获取服务器上的实际文件夹路径（缓存中的encoded_name）
    
    Args:
        folder_path: 前端使用的文件夹路径（已剥离命名空间）
        email: 邮箱地址
        folder_mapping: 文件夹映射字典（从缓存中获取）
        
    Returns:
        服务器上的实际路径（encoded_name）
    """
    # 如果在映射中直接找到，返回encoded_name
    if folder_path in folder_mapping:
        return folder_mapping[folder_path].get('encoded_name', folder_path)
    
    # 如果没找到，尝试添加命名空间前缀后查找
    provider = get_provider_by_email(email)
    if provider:
        namespace_folders = provider.get('namespace_folders', [])
        for ns_folder in namespace_folders:
            # 尝试添加命名空间前缀
            full_path = f"{ns_folder}/{folder_path}"
            if full_path in folder_mapping:
                return folder_mapping[full_path].get('encoded_name', full_path)
    
    # 都没找到，返回原路径
    return folder_path

def add_namespace_folder(folder_path: str, email: str, all_server_folders: list) -> str:
    """
    为文件夹路径添加命名空间前缀（用于与服务器通信）
    只在需要时添加（如果服务器上存在带命名空间的完整路径）
    
    Args:
        folder_path: 前端使用的文件夹路径（已剥离命名空间）
        email: 邮箱地址
        all_server_folders: 服务器上所有文件夹的原始路径列表
        
    Returns:
        服务器上的实际路径
    """
    provider = get_provider_by_email(email)
    if not provider:
        return folder_path
    
    namespace_folders = provider.get('namespace_folders', [])
    if not namespace_folders:
        return folder_path
    
    # 检查是否需要添加命名空间
    for ns_folder in namespace_folders:
        full_path = f"{ns_folder}/{folder_path}"
        # 如果服务器上存在完整路径，返回完整路径
        if full_path in all_server_folders:
            logger.debug(f"添加命名空间文件夹: '{folder_path}' -> '{full_path}'")
            return full_path
    
    # 不需要添加命名空间，返回原路径
    return folder_path